using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Core
{
    [Serializable]
    public class RegistroExamen : BusinessBase<RegistroExamen>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> EstudianteIdProperty = RegisterProperty<string>(o => o.EstudianteId, "Name");
        public string EstudianteId
        {
            get { return GetProperty(EstudianteIdProperty); }
            set { SetProperty(EstudianteIdProperty, value); }
        }

        private static PropertyInfo<string> HorarioIdProperty = RegisterProperty<string>(o => o.HorarioId, "Name");
        public string HorarioId
        {
            get { return GetProperty(HorarioIdProperty); }
            set { SetProperty(HorarioIdProperty, value); }
        }

        private static PropertyInfo<string> DiaIdProperty = RegisterProperty<string>(o => o.DiaId, "Name");
        public string DiaId
        {
            get { return GetProperty(DiaIdProperty); }
            set { SetProperty(DiaIdProperty, value); }
        }

        private static PropertyInfo<string> NivelIdProperty = RegisterProperty<string>(o => o.NivelId, "Name");
        public string NivelId
        {
            get { return GetProperty(NivelIdProperty); }
            set { SetProperty(NivelIdProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        private static PropertyInfo<DateTime> HoraProperty = RegisterProperty<DateTime>(o => o.Hora, "Name");
        public DateTime Hora
        {
            get { return GetProperty(HoraProperty); }
            set { SetProperty(HoraProperty, value); }
        }

        private static PropertyInfo<int> EstadoProperty = RegisterProperty<int>(o => o.Estado, "Name");
        public int Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }

        private static PropertyInfo<int> NumeroCambiosProperty = RegisterProperty<int>(o => o.NumeroCambios, "Name");
        public int NumeroCambios
        {
            get { return GetProperty(NumeroCambiosProperty); }
            set { SetProperty(NumeroCambiosProperty, value); }
        }

        private static PropertyInfo<string> NumeroFacturaProperty = RegisterProperty<string>(o => o.NumeroFactura, "Name");
        public string NumeroFactura
        {
            get { return GetProperty(NumeroFacturaProperty); }
            set { SetProperty(NumeroFacturaProperty, value); }
        }

        private static PropertyInfo<string> ItemProperty = RegisterProperty<string>(o => o.Item, "Item");
        public string Item
        {
            get { return GetProperty(ItemProperty); }
            set { SetProperty(ItemProperty, value); }
        }

        private static PropertyInfo<string> FechaPagoProperty = RegisterProperty<string>(o => o.FechaPago, "FechaPago");
        public string FechaPago
        {
            get { return GetProperty(FechaPagoProperty); }
            set { SetProperty(FechaPagoProperty, value); }
        }

        private static PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(o => o.Identificacion, "Identificacion");
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
            set { SetProperty(IdentificacionProperty, value); }
        }

        private static PropertyInfo<string> ObservacionProperty = RegisterProperty<string>(o => o.Observacion, "Observacion");
        public string Observacion
        {
            get { return GetProperty(ObservacionProperty); }
            set { SetProperty(ObservacionProperty, value); }
        }

        public int Resp { get; set; }
        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static RegistroExamen NewRegistroExamen()
        {
            return DataPortal.Create<RegistroExamen>();
        }

        public static RegistroExamen GetRegistroExamen(Guid id)
        {
            return DataPortal.Fetch<RegistroExamen>(id);
        }

        public static void DeleteRegistroExamen(Guid id)
        {
            DataPortal.Delete<RegistroExamen>(id);
        }

        private RegistroExamen()
        { LoadProperty(IdProperty, Guid.NewGuid()); }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria)};
            var datos = accesoDatos.EjecutarReader("ConsultarSolicitudEvaluacion", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(EstudianteIdProperty, datos.Datos.GetString(1));
                LoadProperty(HorarioIdProperty, datos.Datos.GetString(2));
                LoadProperty(DiaIdProperty, datos.Datos.GetString(3));
                LoadProperty(NivelIdProperty, datos.Datos.GetString(4));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(5)));
                LoadProperty(HoraProperty, DateTime.Parse(datos.Datos.GetString(6)));
                LoadProperty(EstadoProperty,Convert.ToInt32(datos.Datos.GetString(7)));
                LoadProperty(NumeroFacturaProperty, datos.Datos.GetString(8));
                LoadProperty(NumeroCambiosProperty, datos.Datos.GetInt32(9));
                LoadProperty(ObservacionProperty,datos.Datos.GetString(10));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Fecha", ReadProperty(FechaProperty)),
                                     new Parametro("Hora", ReadProperty(HoraProperty)),
                                     new Parametro("Dia", ReadProperty(DiaIdProperty)),
                                     new Parametro("Nivel", ReadProperty(NivelIdProperty)),
                                     new Parametro("Estudiante", ReadProperty(EstudianteIdProperty)),
                                     new Parametro("Estado", ReadProperty(EstadoProperty)),
                                     new Parametro("Horario", ReadProperty(HorarioIdProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty)),
                                     new Parametro("Factura", ReadProperty(NumeroFacturaProperty)),
                                     new Parametro("FechaFactura", ReadProperty(FechaPagoProperty)),
                                     new Parametro("ItemDerecho", ReadProperty(ItemProperty)),
                                     new Parametro("Identificacion", ReadProperty(IdentificacionProperty))
                                 };
           var resp =  accesoDatos.EjecutarScalar("InsertarSolicitudEvaluacion", parametros);
            int r;
            int.TryParse(resp.ToString(), out r);
            Resp = r;
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Fecha", ReadProperty(FechaProperty)),
                                     new Parametro("Hora", ReadProperty(HoraProperty)),
                                     new Parametro("Dia", ReadProperty(DiaIdProperty)),
                                     new Parametro("Nivel", ReadProperty(NivelIdProperty)),
                                     new Parametro("Estado", ReadProperty(EstadoProperty)),
                                     new Parametro("Horario", ReadProperty(HorarioIdProperty)),
                                     new Parametro("Observacion", ReadProperty(ObservacionProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            var resp = accesoDatos.EjecutarScalar("ActualizarSolicitudEvaluacion", parametros);
            int r;
            int.TryParse(resp.ToString(), out r);
            Resp = r;
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(ReadProperty(IdProperty));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", ReadProperty(IdProperty))};
            accesoDatos.EjecutarQuery("EliminarSolicitudEvaluacion", parametros);
        }

        #endregion
    }
}
